// @include "../code/Browser.js"
// @include "../code/Type.js"
// @include "../extend/Debug.js"
// @include "CSS.js"
/**
 * @fileOverview 页面节点操作工具
 * 
 * @version qinglan_dom 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 页面节点操作节点命名空间
 * 
 * @namespace
 * @type Object
 */
qinglan.Dom = qinglan.Dom || {};
/**
 * document对象的缓存
 * 
 * @type Document
 */
qinglan.Dom.d = document;
/**
 * 通过ID得到元素接点<br/>如果得不到元素则返回Id字串
 * 
 * @public
 * @function
 * @param {String}
 *            id 元素节点ID
 * @return {String}{Element}
 */
qinglan.Dom.get = function(id) {
	return qinglan.Dom.d.getElementById(id) || id;
};
/**
 * 通过className得到元素
 * 
 * @public
 * @function
 * @param {String}
 *            className 节点元素的ClassName
 * @param {String}
 *            tag 节点的TagName
 * @param {Element}
 *            content 所需要搜索的上下文 ,请使用的时候直接指定上下文节点,为了性能问题
 * @return {Array} 搜索到的节点
 */
qinglan.Dom.getByClass = function(className, tag, content) {
	tag = tag || "*";
	content = content || qinglan.Dom.d;
	var eles = root.getElementsByTagName(tag);
	var result = new Array();
	qinglan.Array.each(eles, function(value) {
				if (qinglan.Css.hasClass(className, eles[i].className)) {
					result.push(eles[i]);
				}
			});
	return result;
};
/**
 * 将节点插入到某节点前面或者后面 <br/> mode 为 'after' 插入节点后面
 * 
 * @public
 * @function
 * @param {Element}
 *            ele 需要插入的节点
 * @param {Element}
 *            target 目标节点
 * @param {String}
 *            mode 插入节点方式 'after' 为插入节点后面
 * @param {Boolean}
 *            copy 是否
 * @return {Boolean} 是否插入成功
 */
qinglan.Dom.insert = function(ele, target, mode, copy) {
	if (qinglan.Type.isElement(ele) && qinglan.Type.isElement(target)) {
		copy && (ele = ele.cloneNode(true));
		var parentNode = target.parentNode;
		if (mode == 'after' || mode == '1') {
			if (parentNode.lastChild == target) {
				parentNode.appendChild(ele);
			} else {
				parentNode.insertBefore(ele, target.nextSibling);
			}
		} else {
			parentNode.insertBefore(ele, target);
		}
		return true;
	} else {
		qinglan.Debug.error('The ele :[' + ele + '] or target '+ target + '] is not Element!!');
		return false;
	}
};
/**
 * 将节点替换某节点
 * 
 * @public
 * @function
 * @param {Element}
 *            ele 需要替换的节点
 * @param {Element}
 *            target 目标节点
 * @param {Boolean}
 *            copy 是否
 * @return {Boolean} 是否插入成功
 */
qinglan.Dom.replace = function(ele, target, copy) {
	try {
		copy && (ele = ele.cloneNode(true));
		var p = target.parentNode;
		p.replaceChild(ele, target);
		return true;
	} catch (e) {
		qinglan.Debug.error('The  target ' + target+ '] is not Element!!');
		return false;
	}
};
/**
 * 根据Key得到ele的属性
 * 
 * @public
 * @function
 * @param {Element}
 *            ele 节点元素 默认是document.body
 * @param {String}
 *            key 需要得到的键
 * @return {Object}{String} key所对应的值
 */
qinglan.Dom.getEleValue = function(ele, key) {
	var node = ele || qinglan.Dom.d.body;
	if (qinglan.Type.isArray(key)) {
		var result = {};
		qinglan.Array.each(key, function(value) {
					result[value] = node[value] || '';
				});
		return result;
	} else {
		return node[key] || '';
	}
};
/**
 * 获取属性映射
 * 
 * @private
 * @type Object
 */
qinglan.Dom.getEleValue._map = {
	client : ['clientWidth', 'clientHeight', 'clientLeft', 'clientTop'],
	scroll : ['scrollWidth', 'scrollHeight', 'scrollLeft', 'scrollTop'],
	offset : ['offsetWidth', 'offsetHeight', 'offsetLeft', 'offsetTop',
			'offsetParent']
};
/**
 * 初始化函数<br/>在文件加载的时候自动执行一次
 * 
 * @field
 * @private
 * @type Boolean
 */
qinglan.Dom._init = (function() {
	// 添加方法
	qinglan.Array.each(['getClient', 'getScroll', 'getOffset'],
			function(value) {
				this[value] = function(ele) {
					return qinglan.Dom.getEleValue(ele,
							qinglan.Dom.getEleValue._map[value.toLowerCase()
									.slice(3)]);
				};
			}, qinglan.Dom);
	return true;
})();
/**
 * getEle函数的引用
 * 
 * @type Function
 */
window.$g = qinglan.Dom.get;
